package com.itheima.proxy;

import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyDemo {
    @Test
    public void test1(){
        final UserService userService = new UserServiceImpl();

        //创建代理对象
        /** jdk动态代理:基于接口,拥有共同的接口
         * 涉及的类:proxy
         * 创建代理对象的方法newProxyInstance
         * 第一个参数:代理目标的类加载器
         * 2参.代理目标可能拥有的接口
         * 3参.代理的目标的具体实现
         */
        UserService us =(UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象
             * @param method 目标方法
             * @param args  目标参数
             * @return
             * @throws Throwable
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                proxy= userService;
                Object obj = null;
                String methodName = method.getName();
                if ("save".equals(methodName)){
                  obj=  method.invoke(proxy,args);
                }else {
                    System.out.println("开启");
                   obj= method.invoke(proxy,args);//执行带有参数的方法
                }

                return obj;
            }
        });
        us.save(20);
    }
}
